package main

import (
	"fmt"
	"io"
	"os"
	"toolsweb-admin/conf"
	"toolsweb-admin/routes"

	"github.com/gin-gonic/gin"
	"github.com/sirupsen/logrus"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

func main() {
	// 加载配置
	config, err := conf.LoadConfig()
	if err != nil {
		logrus.Fatalf("加载配置失败: %v", err)
	}

	// 设置日志级别
	setLogLevel(config.LogLevel)

	// 设置 Gin 的日志输出
	gin.DefaultWriter = io.MultiWriter(os.Stdout, getLogFile("gin.log"))
	gin.DefaultErrorWriter = io.MultiWriter(os.Stderr, getLogFile("gin_error.log"))

	// 初始化数据库连接
	db, err := initDB(config)
	if err != nil {
		logrus.Fatalf("初始化数据库失败: %v", err)
	}

	// 执行数据库迁移
	//if err := migrations.InitTables(db); err != nil {
	//	logrus.Fatalf("数据库迁移失败: %v", err)
	//}

	// 设置 Gin 模式
	gin.SetMode(getGinMode(config.Environment))

	// 初始化路由
	r := gin.Default()
	// 中间件中设置对象到上下文
	r.Use(func(c *gin.Context) {
		c.Set("db", db)
		c.Next()
	})

	routes.SetupRoutes(r)

	// 启动服务器
	addr := fmt.Sprintf(":%s", config.Server.Port)
	logrus.Infof("服务器启动在 %s", addr)
	if err := r.Run(addr); err != nil {
		logrus.Fatalf("启动服务器失败: %v", err)
	}
}

func setLogLevel(level string) {
	switch level {
	case "debug":
		logrus.SetLevel(logrus.DebugLevel)
	case "info":
		logrus.SetLevel(logrus.InfoLevel)
	case "warn":
		logrus.SetLevel(logrus.WarnLevel)
	case "error":
		logrus.SetLevel(logrus.ErrorLevel)
	default:
		logrus.SetLevel(logrus.InfoLevel)
	}
}

func getLogFile(filename string) *os.File {
	file, err := os.OpenFile(filename, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
	if err != nil {
		logrus.Fatalf("无法打开日志文件: %v", err)
	}
	return file
}

func getGinMode(env string) string {
	switch env {
	case "production":
		return gin.ReleaseMode
	case "test":
		return gin.TestMode
	default:
		return gin.DebugMode
	}
}

func initDB(config *conf.Config) (*gorm.DB, error) {
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
		config.DB.User,
		config.DB.Password,
		config.DB.Host,
		config.DB.Port,
		config.DB.Name,
	)

	return gorm.Open(mysql.Open(dsn), &gorm.Config{})
}
